home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 147 / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin / tools / ask / dictk / source / dictk.s < prev   
Text File  |  1998-09-30  |  25KB  |  987 lines

  1. *********************************************************************
  2. *    ASK3アクセサリ DicTK V3.1
  3. *        Copyright (C) 1996-98 by AIG-Soft
  4. *********************************************************************
  5.  
  6.     .include    defines.mac
  7.     .include    pspdef.mac
  8.     .include    ask3.mac
  9.     .include    gmd.mac
  10.     .xref        _GMDSetAPI
  11.     .xref        GMDCallAPI
  12.  
  13. *********************************************************************
  14. *    常駐ルーチン
  15. *********************************************************************
  16. * 年号をわざわざテキストでなしにバイナリー化しているのは、テキストのみより
  17. * 誤った一致をしにくいから
  18.  
  19.     .text
  20.     .even
  21. KEEP_START:
  22.     * 常駐確認用識別子
  23. id:    .dc.b    'DicTK V3.1',19,98,'AIG-Soft',0
  24.  
  25. *********************************************************************
  26. * ワーク1
  27. *********************************************************************
  28.  
  29.     .even
  30. ACh:        .dc.l    -1    * アクセサリアドレス(初期値-1<0)
  31. first:        .dc.w    0    * DicTouroku
  32. ferr:        .dc.w    0    * DicTouroku
  33. NulPt:        .dc.l    0    * NULデバイスのアドレス
  34. AdGMDAPI:    .dc.l    0    * GMDのAPIアドレス(0=GMDなし)
  35.  
  36. hinname:    * 品詞名アドレス群
  37.     .dc.l Hin01,Hin02,Hin03,Hin04,Hin05,Hin06,Hin07,Hin08,Hin09,Hin10
  38.     .dc.l Hin11,Hin12,Hin13,Hin14,Hin15,Hin16,Hin17,Hin18,Hin19,Hin20
  39.     .dc.l Hin21,Hin22,Hin23,Hin24,Hin25,Hin26,Hin27,Hin28,Hin29,Hin30
  40.  
  41. MEISI    equ    17    * 名詞の品詞番号
  42. HINMAX    equ    30    * 品詞種類数
  43.  
  44. TErrMes:    * エラーメッセージアドレス表
  45.     .dc.l    ErrDicShu,ErrHinshi,ErrYomi,ErrTouroku,ErrDicOpen,ErrASKExec
  46.  
  47. * 登録系エラーメッセージ
  48. ErrDicShu:    .dc.b '辞書種類がおかしい',0
  49. ErrHinshi:    .dc.b '品詞がおかしい',0
  50. ErrYomi:    .dc.b '読みがおかしい',0
  51. ErrTouroku:    .dc.b '登録できない',0
  52. ErrDicOpen:    .dc.b '辞書がオープン出来ない',0
  53. ErrASKExec:    .dc.b 'ASKが起動出来ない',0
  54. * その他エラーメッセージ
  55. ErrYomi2Long:    .dc.b '読みが長すぎる',0
  56.  
  57. * メッセージ
  58. JNAME:    .dc.b '辞書登録',0
  59. YNAME:    .dc.b '読み=',0
  60. TNAME:    .dc.b '単語=',0
  61. HNAME:    .dc.b '品詞=',0
  62.  
  63. TLEN    equ    6        * "単語="の長さ
  64. LMAX    equ    39*2-TLEN    * 入力最大長
  65.  
  66. * 品詞名群(V3では4文字以内に統一)
  67. Hin01:    .dc.b 'カ行五段',0
  68. Hin02:    .dc.b 'ガ行五段',0
  69. Hin03:    .dc.b 'サ行五段',0
  70. Hin04:    .dc.b 'タ行五段',0
  71. Hin05:    .dc.b 'ナ行五段',0
  72. Hin06:    .dc.b 'バ行五段',0
  73. Hin07:    .dc.b 'マ行五段',0
  74. Hin08:    .dc.b 'ラ行五段',0
  75. Hin09:    .dc.b 'ワ行五段',0
  76. Hin10:    .dc.b 'サ変変格',0
  77. Hin11:    .dc.b 'カ変変格',0
  78. Hin12:    .dc.b '上下一段',0
  79. Hin13:    .dc.b '形容詞',0
  80. Hin14:    .dc.b '形容動詞',0
  81. Hin15:    .dc.b '形動名詞',0
  82. Hin16:    .dc.b 'サ変名詞',0
  83. Hin17:    .dc.b '名詞',0
  84. Hin18:    .dc.b '単漢字',0
  85. Hin19:    .dc.b '人名(姓)',0
  86. Hin20:    .dc.b '人名(名)',0
  87. Hin21:    .dc.b '地名',0
  88. Hin22:    .dc.b '団体名',0
  89. Hin23:    .dc.b '物の名称',0
  90. Hin24:    .dc.b '数詞',0
  91. Hin25:    .dc.b '数字',0
  92. Hin26:    .dc.b '接尾語',0
  93. Hin27:    .dc.b '感動詞',0
  94. Hin28:    .dc.b '接続詞',0
  95. Hin29:    .dc.b '副詞',0
  96. Hin30:    .dc.b '連体詞',0
  97.     .even
  98.  
  99. *********************************************************************
  100. * 本来外部にあるべきルーチン
  101. *********************************************************************
  102. * 本来外部にあるべきルーチン
  103. * DicTK内部はスーパーバイザーで走るから、これで良い。
  104.  
  105. GMDAPI0    macro no
  106.     moveq.l    #no,d0        * コマンドセット
  107.     bsr    GMDCallAPI0    * GMD API呼びだし
  108.     endm
  109.  
  110. GMDCallAPI0:            * API呼びだし
  111. * d0.b=コマンド
  112.     move.l    AdGMDAPI(pc),-(sp)
  113.     rts            * 飛び先からrtsする
  114.  
  115. *********************************************************************
  116.  
  117. BREAKOFF    macro
  118.     move.w    #-1,-(sp)    * read BREAK mode
  119.     DOS    _BREAKCK
  120.     move.w    d0,brksts
  121.     clr.w    -(sp)        * BREAK Cut
  122.     DOS    _BREAKCK
  123.     addq.w    #2*2,sp
  124.     endm
  125.  
  126. BREAKON    macro
  127.     move.w    brksts(pc),-(sp)
  128.     DOS    _BREAKCK    * BREAK on
  129.     addq.w    #2,sp
  130.     endm
  131.  
  132. DicTouroku:
  133. * 辞書登録アクセサリ
  134. * 1文字入力される毎にここに来る
  135.     move.w    4+2(sp),d0    * code
  136. *    movem.l    d3-d7/a3-a6,-(sp)
  137.     move.w    d0,d7        * d7=code(キーコード)
  138.     BREAKOFF        * d0破壊
  139.     move.w    #CACI_NORMAL,d3    * 規定外キー入力は無視するため(など)
  140.     moveq.l    #0,d4        * 文字列を反転しない(msmode=0)
  141.     sub.l    a3,a3        * mes=NULL(a3=0):メッセージ出力無し
  142.     * メインルーチン
  143.     move.w    first(pc),d0
  144.     add.w    d0,d0        * for .w
  145.     move.w    FirstJTBL(pc,d0.w),d0
  146.     jsr    FirstJTBL(pc,d0.w)    * first毎の処理(0/1/2/3)
  147.     * ret=d3.l , msmode=d4.l
  148.     * メッセージがあったら表示(a3)
  149.     cmp.l    #0,a3        * mes=NULL?
  150.     beq    1f        * Yes
  151.     * メッセージがある
  152.     cmp.l    #2,d4        * msmode=2?
  153.     bne    @f
  154.     BEEP            * エラー(d0,d1破壊)
  155.     moveq.l    #1,d4        * msmode=1(反転表示)
  156. @@:    * kbuf[Str2MEAN(mes,kbuf,msmode)]=0
  157.     move.l    a3,a0        * mes
  158.     move.l    #kbuf,d0
  159.     move.l    d4,d1        * msmode
  160.     bsr    Str2MEANS
  161.     or.w    #DF_KWINSTR,d3    * kstrを表示させるため
  162. 1:    BREAKON            * d0破壊
  163.     move.w    d3,d0        * return(ret)
  164. *    movem.l    (sp)+,d3-d7/a3-a6
  165.     rts
  166.  
  167. FirstJTBL:
  168.     * first順
  169.     .dc.w    PrintYomi-FirstJTBL    // 0
  170.     .dc.w    TangoJunbi-FirstJTBL    // 1
  171.     .dc.w    TagoShitei-FirstJTBL    // 2
  172.     .dc.w    HinshiSelect-FirstJTBL    // 3
  173.  
  174. *------------------------------------
  175.  
  176. Str2MEANS:
  177. * buf[Str2MEAN(mes,buf,mode)]=0
  178. * a0   <- mes
  179. * d0.l <- buf
  180. * d1.l <- mode (0=通常表示,1=反転表示)
  181.     move.l    d1,-(sp)    * mode
  182.     move.l    d0,-(sp)    * buf
  183.     pea    (a0)        * mes
  184.     pea    62.w
  185.     DOS    _KNJCTRL
  186.     lea    4*4(sp),sp
  187.     move.l    -8(sp),a0    * buf
  188.     add.w    d0,d0        * .w=MEAN
  189.     clr.w    (a0,d0.w)    * buf[..]=0
  190.     rts
  191.  
  192. *------------------------------------
  193.  
  194. SearchKeyJ:
  195. * d7.w <- code
  196. * a0   <- jump table
  197. * 少なくともd0/d1/a0破壊
  198.     move.w    d7,d1
  199.     and.w    #NAKEY,d1
  200. @@:    move.l    (a0)+,d0    * jump|code
  201.     beq    @f        * -> end of table
  202.     cmp.w    d1,d0        * =code?
  203.     bne    @b        * no
  204.     swap    d0        * d0=jump
  205.     jmp    -4(a0,d0.w)    * 飛び先からrtsする
  206. *
  207. @@:    rts            * default
  208.  
  209. *------------------------------------
  210.  
  211. PrintYomi:
  212. * 読みの表示(first=0)
  213.     tst.w    ferr
  214.     beq    @f
  215.     clr.w    ferr
  216.     move.w    #CACI_END,d3
  217.     rts            * 元に戻る(変換ライン仮入力)
  218. *
  219. @@:    * このときcbufに入っているのが読みとなる
  220.     lea    cbuf(pc),a3    * mes=cbuf
  221.     move.l    a3,a0
  222.     moveq.l    #-1,d0
  223. @@:    addq.w    #1,d0        * strlen(cbuf)
  224.     tst.b    (a0)+
  225.     bne    @b
  226.     cmp.w    #LMAX,d0    * len>LMAX?
  227.     bls    @f
  228.     * 読みが長すぎる
  229.     lea    ErrYomi2Long(pc),a3    * mes=エラーメッセージ
  230.     moveq.l    #2,d4        * msmode=2
  231.     move.w    #1,ferr        * ferr=1
  232.     rts
  233. *
  234. @@:    * 読みの長さはok
  235.     move.l    a3,a0        * mes=cbuf
  236.     lea    yomi(pc),a1
  237. @@:    move.b    (a0)+,(a1)+    * yomi<-mes
  238.     bne    @b
  239.     *
  240.     lea    YNAME(pc),a0    * "読み="
  241.     lea    yomi(pc),a2    * 読みそのもの
  242.     bsr    StrCpyCat    * mes<-YNAME+yomi
  243.     *
  244.     lea    JNAME(pc),a0    * 辞書登録
  245.     move.l    #mbuf,d0
  246.     moveq.l    #1,d1        * 反転表示
  247.     bsr    Str2MEANS
  248.     move.w    #CACI_NORMAL|DF_MWINSTR,d3
  249.     move.w    #1,first    * 次のキー入力からが実際の単語登録になる
  250.     rts
  251.  
  252. *------------------------------------
  253.  
  254. TangoJunbi:
  255. * "単語="(TNAME)の表示と取り込み準備(first=1)
  256. * 現在は読みが表示されている
  257.     * この段階で終了キーが押されたら終わってしまう
  258.     and.w    #NAKEY,d7
  259.     cmp.w    #NOT_ASCII|TOUROKU_KEY,d7
  260.     beq    1f        * CTRL+登録のキーリピートですぐ終わらないように
  261.     cmp.w    #ESC,d7
  262.     bne    @f
  263.     * 単語指定中->終了
  264.     clr.w    first
  265.     move.w    #CACI_END,d3
  266. 1:    rts
  267. *
  268. @@:    * 単語指定モード
  269.     move.l    CSRX.w,xy0    * 現在のカーソル位置を保存(x,y)
  270.     move.w    #2,first    * first=2
  271.     moveq.l    #0,d0
  272.     move.l    d0,pt        * pt=pt2=0
  273.     move.w    d0,ferr        * ferr=0
  274.     lea    tango(pc),a3    * mes=tango
  275.     move.l    a3,a0
  276.     lea    TNAME(pc),a1
  277. @@:    move.b    (a1)+,(a0)+    * tango<-TNAME
  278.     bne    @b
  279.     * GMD設定(これは使用直前に設定する)
  280.     lea    Writer(pc),a2
  281.     GMDAPI0    GMD_SetWriter    * Writer設定
  282.     move.l    d0,Wt
  283.     lea    Group(pc),a2
  284.     GMDAPI0    GMD_SetGroup    * Group設定
  285.     move.l    d0,Gp
  286.     move.w    #CACI_URGENT,d3    * TNAMEを表示してすぐに戻ってくる
  287.     rts
  288.  
  289. *------------------------------------
  290.  
  291. TagoShitei:
  292. * 単語指定モード(first=2)
  293.     move.l    CSRXMAX.w,d5    * テキスト画面の幅:xm|ym
  294.     swap    d5
  295.     move.l    CSRX.w,d6    * カーソル位置    : x|y
  296.     swap    d6        * xの方がよく処理されるのでxをlowに置く
  297.     lea    TJTable(pc),a0
  298.     bsr    SearchKeyJ    * キーに相当した処理へのジャンプ
  299.     * <- ここに戻ってくる
  300.     * カーソル移動
  301.     swap    d6        * y|x -> x|y
  302.     bmi    @f        * d6.l=-1のときはカーソルはすでに移動されているので処理しない
  303.     cmp.l    CSRX.w,d6
  304.     beq    @f        * 移動はない
  305.     * カーソルoffは移動時の瞬間だけにしてカーソルが見えなくなるのを最小限にする
  306.     IOCS    _B_CUROFF    * カーソルを操作するため
  307.     move.l    d6,CSRX.w
  308.     IOCS    _B_CURON    * カーソル戻し
  309. @@:    rts
  310.  
  311. TJTable:
  312.     * jump先(offset),code
  313.     .dc.w    LT_CLR-$,NOT_ASCII|CLR_KEY
  314.     .dc.w    LT_BS-$,BS
  315.     .dc.w    LT_SPC-$,SPC
  316.     .dc.w    LT_CR-$,CR
  317.     .dc.w    LT_TOUROKU-$,NOT_ASCII|TOUROKU_KEY
  318.     .dc.w    LT_ESC-$,ESC
  319.     .dc.w    LT_UNDO-$,NOT_ASCII|UNDO_KEY
  320.     * 以下はカーソル移動キー
  321.     .dc.w    LT_LEFT-$,NOT_ASCII|LEFT_KEY
  322.     .dc.w    LT_UP-$,NOT_ASCII|UP_KEY
  323.     .dc.w    LT_RIGHT-$,NOT_ASCII|RIGHT_KEY
  324.     .dc.w    LT_DOWN-$,NOT_ASCII|DOWN_KEY
  325.     .dc.w    LT_DEL-$,NOT_ASCII|DEL_KEY
  326.     .dc.w    LT_HOME-$,NOT_ASCII|HOME_KEY
  327.     .dc.w    0,0        * end of table
  328.  
  329. LT_CR:    * 単語決定
  330.     tst.w    pt
  331.     bne    @f
  332.     * まだ1文字も指定されていない
  333.     BEEP            * d0,d1破壊
  334.     rts
  335. *
  336. @@:    move.w    #MEISI,fhinshi    * 次は品詞選択(名詞から)
  337.     move.w    #3,first    * first=3
  338.     bra    HINEND
  339.  
  340. LT_TOUROKU:    * 登録
  341. DEND:    btst.l    #B_CTRL_ON,d7
  342.     bne    8f        * CTRL+登録で中断
  343. LT_ESC:        * 単語指定中->終了
  344. DEND2:    * GMDを戻す(これは毎回必要)
  345.     move.l    Wt(pc),d0
  346.     GMDAPI0    GMD_SetWriter    * Writer戻し
  347.     move.l    Gp(pc),d0
  348.     GMDAPI0    GMD_SetGroup    * Group戻し
  349.     clr.w    first        * 読みの表示に戻る
  350.     move.w    #CACI_END,d3    * 終了
  351. LT_UNDO:    * カーソルを元の位置に戻す
  352.     move.l    xy0(pc),d6    * x|y
  353.     swap    d6        * y|x(他に合わせるため)
  354. 8:    rts
  355.  
  356. LT_BS:    * 読み込み中文字1文字削除
  357.     move.w    pt(pc),d0
  358.     beq    8b        * pt=0:何も入っていないときは何もしない
  359.     * pt>0
  360.     subq.w    #1,d0        * pt--
  361.     move.w    d0,pt
  362.     add.w    d0,d0        * for word
  363.     moveq.l    #1,d1        * pt2-1
  364.     lea    wtango(pc),a0
  365.     add.w    d0,a0
  366.     cmp.w    #$ff,(a0)    * wtango[pt]>$ff?
  367.     bls    @f        * <=
  368.     moveq.l    #2,d1        * pt2-2
  369. @@:    sub.w    d1,pt2
  370.     clr.w    (a0)        * wtango[pt]=0
  371.     bra    ENT
  372.  
  373. LT_CLR:    * 読み込み中文字全削除
  374.     tst.w    pt
  375.     beq    7f        * pt=0:何も入っていないときは何もしない
  376.     clr.l    pt        * pt=pt2=0
  377.     clr.w    wtango        * wtango[0]=0
  378.     bra    ENT
  379. *
  380. LT_SPC:    * 1文字取得
  381.     moveq.l    #-1,d6        * カーソルはすでに移動されているの印
  382.     btst.l    #B_CTRL_ON,d7
  383.     beq    @f        * SPCで1文字読みとり
  384.     * CTRL+SPC:単語一気読みとり
  385.     moveq.l    #-1,d1        * 現在カーソル位置から
  386.     GMDAPI0    GMD_ReadTango    * カーソルも移動する
  387.     tst.l    d0
  388.     beq    7f        * -> rts 1文字も読み込めていない
  389.     bra    ENT
  390.     *
  391. @@:    * SPC:1文字読み込み
  392.     move.w    #$a0,d1        * SHIFT+SPACE = $a0スペースのため
  393.     btst.l    #B_SHIFT_ON,d7
  394.     bne    @f        * -> SHIFT+SPACE
  395.     * 1文字読み込み
  396.     moveq.l    #-1,d1        * 現在カーソル位置から
  397.     GMDAPI0    GMD_Read1    * -> d0.l
  398.     move.l    d0,d1        * 保存
  399.     swap    d1        * d1.w=幅
  400.     GMDAPI0    GMD_MoveCursor    * カーソル移動
  401.     swap    d1        * d1.w=文字
  402.     cmp.w    #NOCHR,d1
  403.     beq    7f        * 読み込めていない(rts)
  404.     cmp.w    #' ',d1        * スペース?
  405.     beq    7f        * Yes -> スペースは書き込まない
  406. @@:    move.w    d1,d0
  407.     bsr    Writer0        * 書き込み
  408.     tst.l    d0
  409.     bne    7f        * error -> ret
  410. ENT:    * 入力した文字を表示
  411.     lea    tango(pc),a3    * mes=tango
  412.     lea    TLEN(a3),a0    * TLENの後ろに単語をつける
  413.     lea    wtango(pc),a1    * t=wtango
  414.     bra.s    6f
  415. *
  416. 5:    cmp.w    #$ff,d1        * <=$ff?
  417.     bls    @f        * Yes
  418.     * 2バイトコード
  419.     move.w    d1,d0
  420.     lsr.w    #8,d0
  421.     move.b    d0,(a0)+    * 2バイトコードの上位バイト
  422. @@:    move.b    d1,(a0)+
  423. 6:    move.w    (a1)+,d1    * c=*t++
  424.     bne    5b
  425.     clr.b    (a0)        * EOS
  426. 7:    rts
  427.  
  428. * カーソル移動
  429. * d6.l = CSRY|CSRX
  430. * d5.l = CSRYMAX|CSRXMAX
  431. LT_HOME:
  432.     moveq.l    #0,d6        * x=y=0
  433.     rts
  434.  
  435. LT_DEL:
  436.     move.l    d5,d6        * x=xm,y=ym
  437.     rts
  438.  
  439. LT_LEFT:
  440.     btst.l    #B_CTRL_ON,d7
  441.     beq    @f        * LEFTのみ
  442.     * CTRL+LEFT : 左端
  443.     clr.w    d6        * x=0
  444. 1:    rts
  445. *
  446. @@:    subq.w    #1,d6        * x--
  447.     bge    1b        * >=0 -> ret
  448.     move.w    d5,d6        * 画面左端x=0->右端x=xm & y-1
  449. LT_UP:
  450.     swap    d6        * y
  451.     subq.w    #1,d6        * y--
  452.     bge    @f        * >=0 -> ret
  453.     swap    d5        * ym
  454.     move.w    d5,d6        * 画面最上y=0->最下y=ym
  455. *    swap    d5
  456. @@:    swap    d6
  457.     rts
  458.  
  459. LT_RIGHT:
  460.     btst.l    #B_CTRL_ON,d7
  461.     beq    @f        * CTRLなし
  462.     * CTRL-RIGHT : 右端
  463.     move.w    d5,d6        * x=xm
  464.     rts
  465. *
  466. @@    btst.l    #B_SHIFT_ON,d7
  467.     beq    @f        * SHIFTなし
  468.     * SHIFT+RIGHT=TAB相当
  469.     and.w    #$fff8,d6    * $fff8=(d6.w/8)*8
  470.     addq.w    #8,d6
  471. @@:    * RIGHTのみ
  472.     addq.w    #1,d6        * x++
  473.     cmp.w    d5,d6        * x<=xm?
  474.     bls    1b        * yes -> ret
  475.     clr.w    d6        * 画面右端x=xm->左端x=0 & y+1
  476. LT_DOWN:
  477.     swap    d6        * y
  478.     swap    d5        * ym
  479.     addq.w    #1,d6        * y++
  480.     cmp.w    d5,d6        * y<=ym?
  481.     bls    @f        * yes -> ret
  482.     clr.w    d6        * 画面最下y=ym->最上y=0
  483. @@:    swap    d6
  484. *    swap    d5
  485.     rts
  486.  
  487. *------------------------------------
  488.  
  489. HinshiSelect:
  490. * 品詞選択モード(first=3)
  491.     tst.w    ferr
  492.     beq    @f
  493.     * さっきエラーが出ている
  494.     clr.w    ferr        * エラーメッセージを消す
  495.     bra.s    HINEND        * 品詞表示
  496. *
  497. @@:    move.w    fhinshi(pc),d5    * fh=fhinshi
  498.     lea    HJTable(pc),a0
  499.     bsr    SearchKeyJ    * キーに相当した処理へのジャンプ
  500.     * <- ここに戻ってくる
  501.     cmp.w    fhinshi,d5    * 品詞は変わった?
  502.     beq    2f        * No -> break
  503.     move.w    d5,fhinshi    * 変わった品詞を保存
  504. HINEND:    * "品詞情報="を表示(d5/d6は破壊しないように)
  505.     move.w    fhinshi(pc),d0
  506.     subq.w    #1,d0        * fhinshi-1
  507.     add.w    d0,d0
  508.     add.w    d0,d0        * for .l
  509.     lea    hinname(pc),a2
  510.     move.l    (a2,d0.w),a2    * a2=hinname[fhinshi-1]
  511.     lea    HNAME(pc),a0
  512.     moveq.l    #1,d4        * msmode=1(反転表示)
  513.     lea    cbuf(pc),a3    * mes=cbuf
  514. StrCpyCat:
  515.     * ここはサブルーチンでもある
  516.     * mes <- (a0)+(a2)
  517.     * a3 <- mes        : 保存
  518.     * a0 <- ?NAME(文字列)    : 破壊
  519.     * a2 <- str        : 破壊
  520.     move.l    a3,a1        * mes(cbuf)
  521. @@:    move.b    (a0)+,(a1)+    * mes<-NAME
  522.     bne    @b
  523.     subq.w    #1,a1        * EOSを消す
  524. @@:    move.b    (a2)+,(a1)+    * mes<<-str
  525.     bne    @b
  526. 2:    rts
  527. *
  528. HJTable:
  529.     * jump先(offset),code
  530.     .dc.w    LH_UP-$,NOT_ASCII|UP_KEY
  531.     .dc.w    LH_DOWN-$,NOT_ASCII|DOWN_KEY
  532.     .dc.w    LH_HOME-$,NOT_ASCII|HOME_KEY
  533.     .dc.w    LH_ESC-$,ESC
  534.     .dc.w    DEND-$,NOT_ASCII|TOUROKU_KEY
  535.     .dc.w    LH_CR-$,CR
  536.     .dc.w    0,0        * end of table
  537. *
  538. * d5.w=fhinshi
  539. LH_UP:        * UP
  540.     subq.w    #1,d5        * fhinshi--
  541.     bgt    @f        * fhinshi>0
  542.     moveq.l    #HINMAX,d5
  543. @@:    rts
  544.  
  545. LH_DOWN:    * DOWN
  546.     addq.w    #1,d5        * fhinshi++
  547.     cmp.w    #HINMAX,d5    * fhinshi<=HINMAX?
  548.     bls    @f
  549.     moveq.l    #1,d5
  550. @@:    rts
  551.  
  552. LH_HOME:    * HOME
  553.     moveq.l    #MEISI,d5    * fhinshi=MEISI
  554.     rts
  555.  
  556. LH_ESC:        * ESC : 品詞選択中->単語指定
  557.     move.w    #2,first    * 単語指定へ戻る
  558.     lea    tango(pc),a3    * mes=tango
  559.     rts
  560.  
  561. DicTourokuSub    macro
  562. * 辞書登録
  563. * d5(fhinshi)は破壊される
  564. local L1,L2
  565.     * 準備
  566.     move.w    d5,a5        * .w -> .l & 品詞保存
  567.     pea    2.w        * 現在の変換モードを記録
  568.     DOS    _KNJCTRL
  569.     move.l    d0,d5        * -> d5
  570.     pea    0.w        * off
  571.     pea    1.w        * ASK終了(起動状態では単語登録出来ないから)
  572.     DOS    _KNJCTRL
  573.     pea    8.w        * 仮名漢字変換モード取得
  574.     DOS    _KNJCTRL
  575.     move.l    d0,d4        * -> d4
  576.     pea    0.w
  577.     pea    7.w        * 仮名漢字変換モードのロック
  578.     DOS    _KNJCTRL
  579.     pea    28.w        * 辞書オープン
  580.     DOS    _KNJCTRL
  581.     lea    4*7(sp),sp
  582.     moveq.l    #5,d7        * 辞書がオープン出来ない時のためreturn(5)
  583.     tst.l    d0
  584.     bne    L1        * error
  585.     * 辞書はオープン出来た
  586.     pea    (a5)        * 品詞
  587.     pea    tango+TLEN(pc)    * 単語
  588.     pea    yomi(pc)    * 読み
  589.     pea    0.w
  590.     pea    30.w        * 辞書登録
  591.     DOS    _KNJCTRL
  592.     move.l    d0,d7        * ferr=0~4
  593.     pea    29.w        * 辞書クローズ
  594.     DOS    _KNJCTRL
  595.     lea    4*6(sp),sp
  596. L1:    * 後処理
  597.     move.l    d4,-(sp)
  598.     pea    7.w        * 仮名漢字変換モードのアンロック
  599.     DOS    _KNJCTRL
  600.     move.l    d5,-(sp)    * ASK再起動
  601.     pea    1.w
  602.     DOS    _KNJCTRL
  603.     lea    4*4(sp),sp
  604.     tst.l    d0
  605.     beq    L2
  606.     moveq.l    #6,d7        * return(6)
  607. L2:    *
  608.     endm
  609.  
  610.  
  611. LH_CR:        * 品詞決定->登録
  612.     DicTourokuSub        * 辞書登録(d5.w=品詞) -> d7.w(ferr)
  613.     move.w    fhinshi,d5    * 品詞は変わっていないの印
  614.     move.w    d7,ferr
  615.     beq    DEND2
  616.     * エラー(その後何かキーが押されるまで表示)
  617.     subq.w    #1,d7        * ferr-1
  618.     add.w    d7,d7
  619.     add.w    d7,d7        * for longword
  620.     lea    TErrMes(pc),a3
  621.     move.l    (a3,d7.w),a3    * mes=TErrMes[ferr-1]
  622.     moveq.l    #2,d4        * msmode=2
  623.     rts
  624.  
  625. *********************************************************************
  626.  
  627. GroupTBL:
  628. * 単語として読みとる文字コードグループ
  629.     *       no, end,start(大ざっぱでよい)
  630.     .dc.w    1,$ec9e,$889f    * 全角:漢字(外字を含む)
  631.     .dc.w    2,$829a,$824f    * 全角:英数
  632.     .dc.w    3,$8396,$829f    * 全角:カナ
  633.     .dc.w    4,$81fc,$8141    * 全角:記号
  634.     .dc.w    4,$84fc,$839f    * 全角:ギリシャ文字など
  635.     .dc.w    5,$007e,$0021    * 半角:かな以外
  636.     .dc.w    6,$00df,$00a1    * 半角:かな
  637.     .dc.w    6,$80df,$80a1    * 1/2:平仮名
  638.     .dc.w    7,$f1df,$f021    * 1/4:上付き
  639.     .dc.w    8,$f3df,$f221    * 1/4:下付き
  640.     .dc.w    0        * end of table(どこにも属さないときはグループ0)
  641.     * よく出てくる順に置くこと
  642.     .even
  643.  
  644. Group:
  645. * 文字コードの属するグループを得る
  646. * 4(sp) <- h.w=文字幅(1/2) , l.w=code
  647. * -> d0.w : グループ番号 (h.wは不定)
  648.     move.w    4+2(sp),d2    * 文字コード
  649.     lea    GroupTBL(pc),a0
  650. @@:    move.w    (a0)+,d0    * グループ番号
  651.     beq    @f        * end
  652.     move.l    (a0)+,d1    * h.w=end , l.w=start
  653.     cmp.w    d1,d2        * c>=start?
  654.     bcs    @b        * no
  655.     swap    d1
  656.     cmp.w    d1,d2        * c<=end?
  657.     bhi    @b        * no
  658. @@:
  659.     rts
  660.  
  661. *********************************************************************
  662.  
  663. Writer:
  664. * 1文字書き込みルーチン
  665. * おもにGMDから呼び出される
  666.     move.w    4+2(sp),d0    * cc=文字コード
  667. Writer0:
  668.     move.l    pt(pc),d1    * pt|pt2
  669.     addq.w    #1,d1        * +sz(=1)
  670.     cmp.w    #$ff,d0        * cc>$ff?
  671.     bls    @f        * no
  672.     addq.w    #1,d1        * Yes : 2byte code
  673. @@:    * d1=pt2+sz
  674.     cmp.w    #LMAX,d1    * >=LMAX?
  675.     bcs    @f        * no
  676.         * Yes : これ以上は書き込めない
  677.         BEEP            * d0,d1破壊
  678.         moveq.l    #1,d0        * return(1)
  679.         rts
  680. @@:    move.w    d1,pt2        * pt2+=sz
  681.     lea    wtango(pc),a0
  682.     swap    d1        * pt
  683.     add.w    d1,d1        * for .w
  684.     add.w    d1,a0
  685.     move.w    d0,(a0)+    * wtango[pt++]=cc
  686.     clr.w    (a0)        * wtango[pt]=0
  687.     addq.w    #1,pt        * pt++
  688.     moveq.l    #0,d0        * return(0)
  689.     rts
  690.  
  691. *********************************************************************
  692. * ワーク2
  693. *********************************************************************
  694. * ここに置くワークは、常駐後に使われるもの
  695. * これらのワークエリアは常駐後に利用可能になるので、
  696. * 以下の非常駐ルーチンからは参照しないこと
  697.  
  698. * 常駐後に非常駐部分をワークエリアにする定義
  699. wordsz        equ    2        * .wのサイズ
  700. longsz        equ    4        * .lのサイズ
  701. *
  702. mbufsz        equ    M_SIZE*wordsz    * .ds.w M_SIZE
  703. kbufsz        equ    K_SIZE*wordsz    * .ds.w K_SIZE
  704. cbufsz        equ    C_SIZE        * .ds.b C_SIZE
  705. wtangosz    equ    (LMAX+1)*wordsz    * .ds.w    LMAX+1
  706. * 以上、確実に偶数サイズ
  707. tangosz        equ    LMAX+TLEN+1+1    * .ds.b +1 for EOS/最後の+1は偶数バイトにするため
  708. yomisz        equ    LMAX+1+1    * .ds.b (LMAX/TLENは共に偶数だから)
  709. *
  710. * ワークエリアアドレス
  711. pt:                    * wtango[pt] : ptとpt2はこの順で並べること
  712. pt2        equ    pt+wordsz    * tango[pt2]
  713. brksts        equ    pt2+wordsz    * BREAKCKモード
  714. fhinshi        equ    brksts+wordsz    * 品詞
  715. xy0        equ    fhinshi+wordsz    * 最初のカーソル位置
  716. Wt        equ    xy0+longsz    * GMD 元Writer
  717. Gp        equ    Wt+longsz    * GMD 元Group
  718. *
  719. mbuf        equ    Gp+longsz    * ASKモード表示
  720. kbuf        equ    mbuf+mbufsz    * ASK入力ライン->ASK
  721. cbuf        equ    kbuf+kbufsz    * ASK入力ライン<-ASK
  722. wtango:        equ    cbuf+cbufsz    * 単語(.w単位)
  723. *
  724. tango:        equ    wtango+wtangosz    * 単語(.b単位)
  725. yomi:        equ    tango+tangosz    * 読み
  726.  
  727. * 常駐部分最後
  728. KEEP_END    equ    yomi+yomisz
  729.  
  730. *********************************************************************
  731. *    非常駐ルーチン
  732. *********************************************************************
  733. * アクセサリ定義構造体
  734. *********************************************************************
  735.  
  736.     .even
  737. ACdef:
  738.     .dc.w    KS_EDITING            * 仮入力有り状態のみ
  739.     .dc.w    CTRL_ON|NOT_ASCII|TOUROKU_KEY    * CTRL+登録
  740.     .dc.l    DicTouroku
  741.     .dc.l    cbuf
  742.     .dc.l    kbuf
  743.     .dc.l    mbuf
  744.  
  745. *********************************************************************
  746. *    アクセサリ 組み込み/解除/初期化
  747. *********************************************************************
  748.  
  749. DeleteAcc:
  750. * a2 <- ACh
  751. * -> Z : =0(ne):error , 1(eq)=ok
  752.     pea    MesDicTK(pc)
  753.     DOS    _PRINT
  754.     move.l    (a2),-(sp)        * ACh
  755.     pea    61.w
  756.     DOS    _KNJCTRL
  757.     lea    4*3(sp),sp
  758.     move.l    #MesDeleteOk,d2        * ok message
  759.     move.l    d0,d1
  760.     beq    @f            * ret=0:Ok
  761.     * error
  762.     move.l    #ErrCantDelete,d2    * error message
  763. @@:    move.l    d2,-(sp)
  764.     DOS    _PRINT
  765.     addq.w    #4,sp
  766.     move.l    d1,d0            * return
  767.     rts
  768.  
  769. *********************************************************************
  770.  
  771. AttachAcc:
  772. * アクセサリの登録
  773. * -> Z : 0(ne)=error , 1(eq)=ok
  774.     * ASKのバージョンチェック
  775.     pea    50.w
  776.     DOS    _KNJCTRL
  777.     addq.w    #4,sp
  778.     cmp.l    #300,d0        * <300? (V3.00未満?)
  779.     bcc    @f        * No (V3.00以降)
  780.     * ASK V3.00以降でない
  781.     moveq.l    #3,d1        * return(3)
  782.     pea    ErrASK3(pc)
  783.     bra    1f
  784. *
  785. @@:    * アクセサリの登録
  786.     pea    MesDicTK(pc)
  787.     DOS    _PRINT
  788.     pea    ACdef(pc)
  789.     pea    60.w
  790.     DOS    _KNJCTRL
  791.     lea    4*3(sp),sp
  792.     cmp.l    #-1,d0        * error?
  793.     bne    @f        * no
  794.     * アクセサリに登録出来ない
  795.     moveq.l    #4,d1        * return(4)
  796.     pea    ErrCantAttach(pc)
  797.     bra    1f
  798. *
  799. @@:    move.l    d0,ACh        * ACh=ret;
  800.     moveq.l    #0,d1        * return(0)
  801.     pea    MesAttachOk(pc)
  802. 1:    DOS    _PRINT
  803.     addq.w    #4,sp
  804.     move.l    d1,d0        * ret
  805.     rts
  806.  
  807. ******************************************************************************
  808. * この中ではa0は壊さないこと(プロセス管理ポインタを参照するため)
  809.  
  810.     .even
  811. chkarg:    * コマンドライン解析(a2=コマンドライン)
  812.     tst.b    (a2)+        * コマンドラインサイズ = 0?
  813.     beq    eos        * Yes : 引数がない
  814. arglp:    bsr    skipsp        * 空白飛ばし
  815.     tst.b    d0        * end?
  816.     beq    eos        * Yes
  817.     * オプションは -? or /?
  818.     cmp.b    #'-',d0
  819.     beq    chkopt
  820.     cmp.b    #'/',d0
  821.     bne    arglp
  822. chkopt:    * オプションチェック
  823.     addq.w    #1,a2        * skip '-' or '/'
  824.     move.b    (a2)+,d0
  825.     beq    usage        * -/のみでオプションがない
  826.     or.b    #$20,d0        * 小文字化
  827.     lea    flags-2(pc),a6    * 後で+2するため-2しておく
  828. @@:    addq.w    #2,a6
  829.     tst.b    1(a6)
  830.     beq    usage        * 全オプションチェック終わり -> 規定外オプション
  831.     tst.b    (a6)        * すでにフラグがセットされている?
  832.     bne    @b        * Yes : 飛ばす(2重指定だからbne usageにしてもいい)
  833.     cmp.b    1(a6),d0    * オプションチェック
  834.     bne    @b        * 不一致
  835.     st.b    (a6)        * セット
  836.     bra    arglp        * コマンドライン処理へ戻る
  837.  
  838. skipsp:    * 空白飛ばし
  839.     move.b    (a2)+,d0
  840.     cmp.b    #' ',d0
  841.     beq    skipsp
  842.     cmp.b    #$09,d0        * TAB
  843.     beq    skipsp
  844.     subq.w    #1,a2        * a2が1つ進んでいるので戻す
  845. eos:    rts
  846.  
  847. *********************************************************************
  848. *    メイン
  849. *********************************************************************
  850.  
  851.     .xref    keepchk
  852.  
  853. main:
  854.     lea.l    initsp(pc),sp    * PROGRAM=の時のため
  855.     
  856.     pea    title(pc)    * タイトル表示
  857.     DOS    _PRINT
  858.     *
  859.     move.l    #(id-KEEP_START),-(sp)    * 識別子の相対位置
  860.     pea.l    (a0)        * 自分のメモリ管理ポインタ
  861.     bsr    keepchk        * 常駐チェック
  862.     lea    4*3(sp),sp
  863.     move.b    d0,d7        * d7 :0=常駐してない , -1=常駐している
  864.     
  865.     * GMD API設定&アドレス保存
  866.     * 常駐/解除どちらでも使うから
  867.     movem.l    a0/a2,-(sp)
  868.     jsr    _GMDSetAPI
  869.     movem.l    (sp)+,a0/a2
  870.     tst.l    d0
  871.     beq    Err_NoGMD    * GMDがない
  872.     move.l    d0,AdGMDAPI
  873.     *
  874.     bsr    chkarg        * コマンドライン引数チェック
  875.     tst.b    rflag        * -r : 常駐解除?
  876.     beq    keep        * no
  877. *
  878. * 常駐解除
  879. *
  880.     tst.b    d7        * 常駐している?
  881.     beq    Err_NoKp    * No -> error
  882.     
  883.     * a0=常駐しているルーチンのメモリ管理ポインタ
  884.     * メモリー管理ポインタを飛ばし、ユーザープログラム先頭へ
  885.     * さらに、AChまで飛ばす
  886.     lea.l    ACh-KEEP_START+PSPSIZ(a0),a2    * AChのアドレス
  887.     bsr    DeleteAcc    * アクセサリ解除
  888.     bne    Err_Kai        * アクセサリ登録削除不可により常駐解除不可
  889.     
  890.     pea.l    MPSIZ(a0)
  891.     DOS    _MFREE        * 自己プロセスメモリー解放
  892.     addq.w    #4,sp
  893.     tst.l    d0
  894.     bmi    Err_Kai        * なぜかメモリー解放出来ない時
  895.     
  896.     * GMDを常駐アンロックする
  897.     GMDAPI    GMD_JUnlock
  898.     
  899.     * 常駐解除正常終了
  900.     pea.l    MesRelease(pc)
  901.     DOS    _PRINT
  902.     addq.w    #4,sp
  903.     clr.w    -(sp)        * exit(0)
  904.     DOS    _EXIT2
  905.  
  906. keep:    * 常駐
  907.     tst.b    d7        * 常駐している?
  908.     bne    Err_Dbl        * Yes -> error(2重常駐)
  909.     
  910.     bsr    AttachAcc    * アクセサリ組み込み
  911.     bne    Err_Keep    * 組み込みエラー
  912.     *
  913.     * アクセサリも組み込みOK
  914.     * GMDを常駐ロックする
  915.     GMDAPI    GMD_JLock
  916.     *
  917.     pea    MesKeep(pc)
  918.     DOS    _PRINT
  919.     clr.w    -(sp)        * exit(0)相当
  920.     pea    (KEEP_END-KEEP_START).w
  921.     DOS    _KEEPPR
  922. *
  923. * エラー終了
  924. *
  925. Err_NoGMD:    * GMDがない
  926.     lea.l    ErrNoGMD(pc),a0
  927.     bra.s    error
  928. Err_NoKp:    * 常駐していないのに解除しようとした
  929.     lea.l    NoKeep(pc),a0
  930.     bra.s    error
  931. Err_Dbl:    * 2重常駐
  932.     lea.l    AlreadyKeep(pc),a0
  933.     bra.s    error
  934. Err_Keep:    * 常駐できない
  935.     lea.l    CantKeep(pc),a0
  936.     bra.s    error
  937. Err_Kai:    * 常駐解除不可
  938.     lea.l    CantRelease(pc),a0
  939.     bra.s    error
  940. usage:    * 使用法
  941.     lea.l    MesUsage(pc),a0
  942. error:    move.w    #2,-(sp)    * STDERR
  943.     pea.l    (a0)
  944.     DOS    _FPUTS        * 標準出力へ
  945.     addq.w    #2+4,sp
  946.     move.w    #2,-(sp)    * exit(2)
  947.     DOS    _EXIT2
  948.  
  949. ******************************************************************************
  950. * メッセージなど
  951. ******************************************************************************
  952.  
  953.     .even
  954. MesDicTK:    .dc.b    'アクセサリ「リアルタイム単語登録」',0
  955. MesDeleteOk:    .dc.b    'を削除しました',$0d,$0a,0
  956. ErrCantDelete:    .dc.b    'が削除できません',$0d,$0a,0
  957. ErrCantAttach:    .dc.b    'が登録できません',$0d,$0a,0
  958. MesAttachOk:    .dc.b    'を登録しました',$0d,$0a,0
  959. ErrASK3:    .dc.b    'ASKがバージョン3以上ではありません',$0d,$0a,0
  960. ErrNoGMD    .dc.b    'GMDが組み込まれていません',$0d,$0a,0
  961.  
  962. title:        .dc.b    'ASK3アクセサリ DicTK V3.1',$0d,$0a
  963.         .dc.b    $09,'Copyright 1996-98 by AIG-Soft'    * CrLfにつながる
  964. CrLf        .dc.b    $0d,$0a,0
  965. MesKeep:    .dc.b    '常駐しました',$0d,$0a,0
  966. MesRelease:    .dc.b    '常駐解除しました',$0d,$0a,0
  967. NoKeep:        .dc.b    '常駐していません',$0d,$0a,0
  968. AlreadyKeep:    .dc.b    'すでに常駐しています',$0d,$0a,0
  969. CantKeep:    .dc.b    '常駐できません',$0d,$0a,0
  970. CantRelease:    .dc.b    '常駐解除できません',$0d,$0a,0
  971. MesUsage:    .dc.b    'DicTK [/R]',$0d,$0a,0
  972.  
  973.     .even
  974. flags:        * work,フラグキャラクター
  975. rflag        .dc.b    0,'r'    * 常駐解除フラグ
  976.         .dc.b    0,0    * end of table
  977.  
  978. ******************************************************************************
  979. * 非常駐ルーチンが使うスタック
  980. ******************************************************************************
  981.     .stack
  982.     .even
  983.     .ds.l    512
  984. initsp:
  985. ******************************************************************************
  986.     .end    main
  987.